package com.smart.community.commons.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 角色代码枚举
 * 统一管理系统中的角色代码，确保大小写一致
 * 根据20250703系统设计调整方案规范化角色代码
 * 根据数据库sc_role表结构完善角色定义
 * 
 * @author Wu.Liang
 * @since 2025-07-06
 * @version 2.1.0
 */
@Getter
@AllArgsConstructor
public enum RoleCodeEnum {
    
    /**
     * 超级管理员
     */
    SUPER_ADMIN("SUPER_ADMIN", "超级管理员", 1, "系统超级管理员,拥有所有权限"),
    
    /**
     * 区域管理员
     */
    REGION_ADMIN("REGION_ADMIN", "区域管理员", 2, "区域管理员,管理多个社区"),
    
    /**
     * 社区管理员
     */
    COMMUNITY_ADMIN("COMMUNITY_ADMIN", "社区管理员", 3, "社区管理员,管理单个社区"),
    
    /**
     * 物业人员
     */
    PROPERTY_STAFF("PROPERTY_STAFF", "物业人员", 4, "物业工作人员"),
    
    /**
     * 安保人员
     */
    SECURITY_STAFF("SECURITY_STAFF", "安保人员", 5, "安保工作人员"),
    
    /**
     * 维修人员
     */
    REPAIR_STAFF("REPAIR_STAFF", "维修人员", 6, "维修工作人员"),
    
    /**
     * 居民
     */
    RESIDENT("RESIDENT", "居民", 7, "社区居民"),
    
    /**
     * 物业管理员
     */
    PROPERTY_ADMIN("PROPERTY_ADMIN", "物业管理员", 2, "物业公司管理员"),
    
    /**
     * 楼栋管理员
     */
    BUILDING_ADMIN("BUILDING_ADMIN", "楼栋管理员", 4, "楼栋管理员"),
    
    /**
     * 单元管理员
     */
    UNIT_ADMIN("UNIT_ADMIN", "单元管理员", 5, "单元管理员"),
    
    /**
     * 房户管理员
     */
    HOUSEHOLD_ADMIN("HOUSEHOLD_ADMIN", "房户管理员", 6, "房户管理员"),
    
    /**
     * 普通用户
     */
    OWNER("OWNER", "业主", 6, "业主"),
    /**
     * 普通用户
     */
    NORMAL_USER("NORMAL_USER", "普通用户", 7, "普通居民用户"),
    
    /**
     * 管理员（预留角色）
     */
    ADMIN("ADMIN", "管理员", 0, "普通管理员(预留角色)");
    
    @JsonValue
    private final String code;
    private final String name;
    private final int sortOrder;
    private final String description;
    
    /**
     * 根据代码获取枚举
     * 
     * @param code 角色代码
     * @return 角色代码枚举
     */
    public static RoleCodeEnum getByCode(String code) {
        if (code == null) {
            return null;
        }
        for (RoleCodeEnum role : values()) {
            if (role.getCode().equals(code)) {
                return role;
            }
        }
        return null;
    }
    
    /**
     * 根据名称获取枚举
     * 
     * @param name 角色名称
     * @return 角色代码枚举
     */
    public static RoleCodeEnum getByName(String name) {
        if (name == null) {
            return null;
        }
        for (RoleCodeEnum role : values()) {
            if (role.getName().equals(name)) {
                return role;
            }
        }
        return null;
    }
    
    /**
     * 判断是否为超级管理员
     * 
     * @param code 角色代码
     * @return 是否为超级管理员
     */
    public static boolean isSuperAdmin(String code) {
        return SUPER_ADMIN.getCode().equals(code);
    }
    
    /**
     * 判断是否为区域管理员
     * 
     * @param code 角色代码
     * @return 是否为区域管理员
     */
    public static boolean isRegionAdmin(String code) {
        return REGION_ADMIN.getCode().equals(code);
    }
    
    /**
     * 判断是否为物业管理员
     * 
     * @param code 角色代码
     * @return 是否为物业管理员
     */
    public static boolean isPropertyAdmin(String code) {
        return PROPERTY_ADMIN.getCode().equals(code);
    }
    
    /**
     * 判断是否为社区管理员
     * 
     * @param code 角色代码
     * @return 是否为社区管理员
     */
    public static boolean isCommunityAdmin(String code) {
        return COMMUNITY_ADMIN.getCode().equals(code);
    }
    
    /**
     * 判断是否为楼栋管理员
     * 
     * @param code 角色代码
     * @return 是否为楼栋管理员
     */
    public static boolean isBuildingAdmin(String code) {
        return BUILDING_ADMIN.getCode().equals(code);
    }
    
    /**
     * 判断是否为单元管理员
     * 
     * @param code 角色代码
     * @return 是否为单元管理员
     */
    public static boolean isUnitAdmin(String code) {
        return UNIT_ADMIN.getCode().equals(code);
    }
    
    /**
     * 判断是否为房户管理员
     * 
     * @param code 角色代码
     * @return 是否为房户管理员
     */
    public static boolean isHouseholdAdmin(String code) {
        return HOUSEHOLD_ADMIN.getCode().equals(code);
    }
    
    /**
     * 判断是否为普通用户
     * 
     * @param code 角色代码
     * @return 是否为普通用户
     */
    public static boolean isNormalUser(String code) {
        return NORMAL_USER.getCode().equals(code);
    }
    
    /**
     * 判断是否为居民
     * 
     * @param code 角色代码
     * @return 是否为居民
     */
    public static boolean isResident(String code) {
        return RESIDENT.getCode().equals(code);
    }
    
    /**
     * 判断是否为物业人员
     * 
     * @param code 角色代码
     * @return 是否为物业人员
     */
    public static boolean isPropertyStaff(String code) {
        return PROPERTY_STAFF.getCode().equals(code);
    }
    
    /**
     * 判断是否为安保人员
     * 
     * @param code 角色代码
     * @return 是否为安保人员
     */
    public static boolean isSecurityStaff(String code) {
        return SECURITY_STAFF.getCode().equals(code);
    }
    
    /**
     * 判断是否为维修人员
     * 
     * @param code 角色代码
     * @return 是否为维修人员
     */
    public static boolean isRepairStaff(String code) {
        return REPAIR_STAFF.getCode().equals(code);
    }
    
    /**
     * 判断是否为管理员角色
     * 
     * @param code 角色代码
     * @return 是否为管理员角色
     */
    public static boolean isAdminRole(String code) {
        return isSuperAdmin(code) || isRegionAdmin(code) || isPropertyAdmin(code) 
            || isCommunityAdmin(code) || isBuildingAdmin(code) || isUnitAdmin(code) 
            || isHouseholdAdmin(code);
    }
    
    /**
     * 判断是否为管理员（兼容性方法）
     * 
     * @param code 角色代码
     * @return 是否为管理员
     */
    public static boolean isAdmin(String code) {
        return isAdminRole(code);
    }
    
    /**
     * 判断是否为物业相关角色
     * 
     * @param code 角色代码
     * @return 是否为物业相关角色
     */
    public static boolean isPropertyRole(String code) {
        return isPropertyAdmin(code) || isPropertyStaff(code) || isCommunityAdmin(code) 
            || isBuildingAdmin(code) || isUnitAdmin(code) || isHouseholdAdmin(code);
    }
    
    /**
     * 判断是否为工作人员角色
     * 
     * @param code 角色代码
     * @return 是否为工作人员角色
     */
    public static boolean isStaffRole(String code) {
        return isPropertyStaff(code) || isSecurityStaff(code) || isRepairStaff(code);
    }
    
    /**
     * 判断是否为居民角色
     * 
     * @param code 角色代码
     * @return 是否为居民角色
     */
    public static boolean isResidentRole(String code) {
        return isResident(code) || isNormalUser(code);
    }
    
    /**
     * 根据角色代码获取描述
     * 
     * @param code 角色代码
     * @return 角色描述
     */
    public static String getDescriptionByCode(String code) {
        RoleCodeEnum role = getByCode(code);
        return role != null ? role.getDescription() : "未知角色";
    }
    
    /**
     * 根据角色代码获取名称
     * 
     * @param code 角色代码
     * @return 角色名称
     */
    public static String getNameByCode(String code) {
        RoleCodeEnum role = getByCode(code);
        return role != null ? role.getName() : "未知角色";
    }
    
    /**
     * 获取所有角色代码
     * 
     * @return 角色代码数组
     */
    public static String[] getAllCodes() {
        RoleCodeEnum[] roles = values();
        String[] codes = new String[roles.length];
        for (int i = 0; i < roles.length; i++) {
            codes[i] = roles[i].getCode();
        }
        return codes;
    }
    
    /**
     * 获取所有角色名称
     * 
     * @return 角色名称数组
     */
    public static String[] getAllNames() {
        RoleCodeEnum[] roles = values();
        String[] names = new String[roles.length];
        for (int i = 0; i < roles.length; i++) {
            names[i] = roles[i].getName();
        }
        return names;
    }
    
    /**
     * 获取管理员角色代码
     * 
     * @return 管理员角色代码数组
     */
    public static String[] getAdminRoleCodes() {
        return new String[]{
            SUPER_ADMIN.getCode(),
            REGION_ADMIN.getCode(),
            PROPERTY_ADMIN.getCode(),
            COMMUNITY_ADMIN.getCode(),
            BUILDING_ADMIN.getCode(),
            UNIT_ADMIN.getCode(),
            HOUSEHOLD_ADMIN.getCode()
        };
    }
    
    /**
     * 获取物业相关角色代码
     * 
     * @return 物业相关角色代码数组
     */
    public static String[] getPropertyRoleCodes() {
        return new String[]{
            PROPERTY_ADMIN.getCode(),
            PROPERTY_STAFF.getCode(),
            COMMUNITY_ADMIN.getCode(),
            BUILDING_ADMIN.getCode(),
            UNIT_ADMIN.getCode(),
            HOUSEHOLD_ADMIN.getCode()
        };
    }
    
    /**
     * 获取工作人员角色代码
     * 
     * @return 工作人员角色代码数组
     */
    public static String[] getStaffRoleCodes() {
        return new String[]{
            PROPERTY_STAFF.getCode(),
            SECURITY_STAFF.getCode(),
            REPAIR_STAFF.getCode()
        };
    }
    
    /**
     * 获取居民角色代码
     * 
     * @return 居民角色代码数组
     */
    public static String[] getResidentRoleCodes() {
        return new String[]{
            RESIDENT.getCode(),
            NORMAL_USER.getCode()
        };
    }
    
    /**
     * Jackson反序列化方法
     * 严格遵循《系统状态枚举权威标准声明.md》规范
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    @JsonCreator
    public static RoleCodeEnum fromCode(String code) {
        return getByCode(code);
    }
} 